package io.github.weiranyi.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
 *  beanFactory: bean工厂；只做一次，执行时机获取map前就得完成
 */
public class BeanFactory {
    private static Map<String,Object> ioc = new HashMap<>();
    // 静态代码块，随着类得加载而加载；程序启动时，初始化对象实例
    static {
        // 1.读取xml,以下代码可以加载指定得配置文件[得到字节输入流]
        InputStream inputStream = BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml");
        // 2.解析XML（dom4j）
        SAXReader saxReader = new SAXReader();
        try {
            Document document = saxReader.read(inputStream); //[将输入流变成dom对象]
            // 3.编写xpath表达式
            String xpath = "//bean";
            // 4.根据xpath得到标签
            List<Element> list = document.selectNodes(xpath); //[得到标签集合]
            // 5.遍历并使用反射创建对象实例，放入map集合（ioc容器）
            for (Element element : list) {
                String id = element.attributeValue("id");
                String className = element.attributeValue("class");
                // 反射生成实例对象
                Object obj = Class.forName(className).newInstance();
                // 存到map中
                ioc.put(id,obj);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static Object getBean(String beanId){
        return ioc.get(beanId);
    }
}
